package com.cskaoyan._09static._06invokeflow;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/6 15:24
 **/
/*
执行流程
1.Demo类加载
2.Demo类中的静态成员要赋值(类加载过程中执行的代码被封装到一个方法里clinit,构造方法栈帧init)
    1)默认初始化,默认赋值
    2)显示赋值
3.在cat显式赋值过程中,会进行cat类的加载
4.Cat类中的静态成员默认赋值,显示赋值
5.Cat类的静态的成员dog显示赋值中,会进行Dog类的加载
6.Dog类中静态成员赋默认值,显式赋值
7.Demo类加载完成了
8.执行main方法
9.new Demo()创建Demo对象,
10.普通成员赋值,默认赋值,显式赋值,构造器赋值
11.在给Demo类中的dog这个普通显式赋值的时候,new Dog()
12.执行Dog中的无参构造方法,执行之前要完成Dog中普通成员的赋值(默认-->显式赋值-->构造器)
13.Demo类中的dog这个普通显式赋值完成
14.Demo中的构造方法
15.重新回到main方法中


 */
public class Demo {
    static Cat cat = new Cat();
    Dog dog = new Dog();
    Dog dog2;
    static Dog dog3;

    public static void main(String[] args) {
        System.out.println("hello world!");
        Demo d = new Demo();
    }

    public Demo() {
        System.out.println("demo");
    }
}

class Cat {
    static Dog dog = new Dog();

    public Cat() {
        System.out.println("cat");
    }
}

class Dog {
    public Dog() {
        System.out.println("dog");
    }
}
